//整数除法
#include<stdio.h>
#include<limits.h>

int divide(int a, int b) {
    //边界考虑（题目要求）
     if (a == INT_MIN && b == -1)
        return INT_MAX;
    
    //有一个负数时
    int sign = (a < 0) ^ (b < 0) ? -1 : 1;

    //这两种方式均不可采用，因为负数取负时有可能溢出，如INI_MIN
    //if(a < 0) a = -a;
    //a = abs(a)
    //因此我们将正数取负
    if (a > 0) a = -a;
    if (b > 0) b = -b;
    
    //最后的次数res可能无法存储在int中(如INT_MIN/1,每次-1，最后次数为-INI_MIN次，存储到int中会溢出)，并且res不会出现负数，因此采用size_t
    unsigned int res = 0;
   //a,b均为负数，所以条件为a <= b
    while (a <= b) {
        a -= b;
        res++;
    }

    //bug 修复：因为不能使用乘号，所以将乘号换成三目运算符
   //return res * sign;----不能使用乘号
    return sign == 1 ? res : -1*res;//使用三目运算符
   // 一元负运算符应用于无符号类型，结果可能仍为无符号类型
     
}
int main() {
    int divide1, divide2;
    scanf("%d %d", &divide1, &divide2);
    printf("%d\n",divide(divide1, divide2));
    return 0;
}
//时间复杂度 o(n)







//为什么-倍数（*2而不是*3），因为任何一个数都可以写成：2^k1 + 2^k2 + ......
//优化时间复杂度：logn*logn(第一个logn是一个循环，即减去divide2的k次倍，k约等于logn；第二个是大循环，即共进行了约logn次循环)
int divide(int a, int b) {
    //边界考虑（题目要求）,除法结果溢出,则返回INT_MIN
    if (a == INT_MIN && b == -1)
        return INT_MAX;
    //有一个负数时
    int sign = (a < 0) ^ (b < 0) ? -1 : 1;

    //这两种方式均不可采用，因为负数取负时有可能溢出，如INI_MIN
    //if(a < 0) a = -a;
    //a = abs(a)
    //因此我们将正数取负
    if (a > 0) a = -a;
    if (b > 0) b = -b;

    //最后的次数res可能无法存储在int中(如INT_MIN/1,每次-1，最后次数为-INI_MIN次，存储到int中会溢出)，并且res不会出现负数，因此采用size_t
    unsigned int res = 0;
    //a,b均为负数，所以条件为a <= b
    while (a <= b) {
        int value = b;
        //k初始值为1，当不进入while，即a>b+b同时a<=b时,一定可以减一次。
        int k = 1;
        // 0xc0000000 是十进制 -2^30 的十六进制的表示
        // 判断 value >= 0xc0000000 的原因：保证 value + value 不会溢出
        // 可以这样判断的原因是：0xc0000000 是最小值 -2^31 的一半，
        // 而 a 的值不可能比 -2^31 还要小，所以 value 不可能比 0xc0000000 小
        // -2^31 / 2 = -2^30
        while (value >= 0xc0000000 && a <= value + value) {
            value += value;
            // 代码优化：如果 k 已经大于最大值的一半的话，那么直接返回最小值
            // 因为这个时候 k += k 的话肯定会大于等于 2147483648 ，这个超过了题目给的范围
            if (k > INT_MAX / 2) {
                return INT_MIN;
            }
            k += k;
        }
        a -= value;
        res += k;
    }

    //bug 修复：因为不能使用乘号，所以将乘号换成三目运算符
   //return res * sign;----不能使用乘号
    return sign == 1 ? res : -1 * res;//使用三目运算符
   // 一元负运算符应用于无符号类型，结果可能仍为无符号类型
}
